//https://leetcode-cn.com/problems/spiral-matrix/
// 1. 一个最直观的暴力解法是 三层循环
// 2. 最外层控制是否遍历结束 i 与 j的关系
// 3. 内部两层循环控制i j 的循环 当到达四个角的边界时 对i 或 j重新赋值 并跳转回最外层循环 直到遍历结束
// 4. 其问题在于每次遍历后 其四角的边界条件会收缩不是一个固定值 所以这种编码方式是复杂 易错的,
// 5. 通常这种情况下我们需要继续抽象,通过将边界条件抽象为一个四个变量来实现收缩可变的特性
// 5. 更优雅的方式是 去重最外层的循环 通过边界变量的大小关系在第二层循环中break的方式结束遍历
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector <int> ans;
        if(matrix.empty()) return ans; //若数组为空，直接返回答案
        int u = 0; //赋值上下左右边界
        int d = matrix.size() - 1;
        int l = 0;
        int r = matrix[0].size() - 1;
        while(true)
        {
            for(int i = l; i <= r; ++i) ans.push_back(matrix[u][i]); //向右移动直到最右
            if(++ u > d) break; //重新设定上边界，若上边界大于下边界，则遍历遍历完成，下同
            for(int i = u; i <= d; ++i) ans.push_back(matrix[i][r]); //向下
            if(-- r < l) break; //重新设定有边界
            for(int i = r; i >= l; --i) ans.push_back(matrix[d][i]); //向左
            if(-- d < u) break; //重新设定下边界
            for(int i = d; i >= u; --i) ans.push_back(matrix[i][l]); //向上
            if(++ l > r) break; //重新设定左边界
        }
        return ans;
    }
};